package com.newspublish.system.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;

import java.util.ArrayList;
import java.util.List;

//swagger2配置类
@Configuration
@EnableSwagger2WebMvc
public class Knife4jConfig {

    @Bean
    public Docket adminApiConfig(){
        //这个方法中首先创建了一个参数列表 pars，用于存储所有的参数配置。
        List<Parameter> pars = new ArrayList<>();

        //创建一个参数对象 tokenPar，用于配置一个名为 "token" 的请求头参数
        ParameterBuilder tokenPar = new ParameterBuilder();
        tokenPar.name("token")  //设置参数名称为token
                .description("用户token")  //说明参数
                .defaultValue("")  //设置token的默认值为空
                .modelRef(new ModelRef("string")) //设置参数的类型为字符串
                .parameterType("header")//设置参数的类型为请求头参数 为请求头的一部分
                .required(false) //是否必须  false表示不必须
                .build();  //构建 生成parameter对象
        pars.add(tokenPar.build());
        //添加head参数end

        //创建一个 Docket 实例 adminApi，指定了文档类型为 SWAGGER_2，组名为 "adminApi"
        Docket adminApi = new Docket(DocumentationType.SWAGGER_2)
                .groupName("adminApi")
                .apiInfo(adminApiInfo())
                .select()
                //进行 API 筛选配置，只显示 com.newspublish 包下以 "/admin/" 开头的路径的 API。
                .apis(RequestHandlerSelectors.basePackage("com.newspublish"))
                .paths(PathSelectors.regex("/admin/.*"))
                .build()
                //配置的参数列表添加到全局的操作参数中
                .globalOperationParameters(pars);
        return adminApi;   //返回
    }

    //配置了文档信息，包括标题、描述、版本和联系人信息。
    private ApiInfo adminApiInfo(){

        return new ApiInfoBuilder()
                .title("后台管理系统-API文档")
                .description("本文档描述了后台管理系统微服务接口定义")
                .version("1.0")
                .contact(new Contact("新闻", "http://www.inewsweek.cn/", "1302520892@qq.com"))
                .build();
    }

}
